package config

import (
	"fmt"
	"time"
)

// DatabaseConfig 数据库配置
type DatabaseConfig struct {
	Host            string        `json:"host" yaml:"host"`                             // 数据库主机地址
	Port            int           `json:"port" yaml:"port"`                             // 数据库端口
	Username        string        `json:"username" yaml:"username"`                     // 用户名
	Password        string        `json:"password" yaml:"password"`                     // 密码
	Database        string        `json:"database" yaml:"database"`                     // 数据库名称
	Charset         string        `json:"charset" yaml:"charset"`                       // 字符集
	ParseTime       bool          `json:"parse_time" yaml:"parse_time"`                 // 是否解析时间
	Loc             string        `json:"loc" yaml:"loc"`                               // 时区
	MaxOpenConns    int           `json:"max_open_conns" yaml:"max_open_conns"`         // 最大打开连接数
	MaxIdleConns    int           `json:"max_idle_conns" yaml:"max_idle_conns"`         // 最大空闲连接数
	ConnMaxLifetime time.Duration `json:"conn_max_lifetime" yaml:"conn_max_lifetime"`   // 连接最大生命周期
	ConnMaxIdleTime time.Duration `json:"conn_max_idle_time" yaml:"conn_max_idle_time"` // 连接最大空闲时间
}

// DefaultDatabaseConfig 默认数据库配置
func DefaultDatabaseConfig() *DatabaseConfig {
	return &DatabaseConfig{
		Host:            "localhost",
		Port:            3306,
		Username:        "root",
		Password:        "",
		Database:        "hawkeye",
		Charset:         "utf8mb4",
		ParseTime:       true,
		Loc:             "Local",
		MaxOpenConns:    100,
		MaxIdleConns:    10,
		ConnMaxLifetime: time.Hour,
		ConnMaxIdleTime: time.Minute * 30,
	}
}

// GetDSN 获取数据库连接字符串
func (c *DatabaseConfig) GetDSN() string {
	parseTimeStr := "true"
	if !c.ParseTime {
		parseTimeStr = "false"
	}
	return c.Username + ":" + c.Password + "@tcp(" + c.Host + ":" + fmt.Sprintf("%d", c.Port) + ")/" + c.Database + "?charset=" + c.Charset + "&parseTime=" + parseTimeStr + "&loc=" + c.Loc
}
